import os, django

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "api_automation_test.settings")
django.setup()

from rest_framework.authentication import TokenAuthentication
from rest_framework.views import APIView

from backend.common.api_response import JsonResponse



from backend.common.common_db import Interface,UpdataCase
import xlrd
from backend.models import *


#用例导入模板excel文件校验
def case_excel_check(x):
    print('bbbbb')
    # book =  xlrd.open_workbook(x)  # 打开excel文件
    try:
        book = xlrd.open_workbook(file_contents=x, on_demand=True)
        print(88)
    except Exception as e:
        print(e)

    sheets = book.sheet_names()  # 获取所有sheet表名
    check_result_list=[] #存放check结果

    for sheet in sheets:
        sh = book.sheet_by_name(sheet)  # 打开每一张表
        row_num = sh.nrows #获取excel的行数
        col_num = sh.ncols #获取excel的列数

        for i in range(0, row_num):  # 从第一行开始读取表中的数据
            row_data = sh.row_values(i)  # 按行获取excel的值

            if i==0:
                Project_name = row_data[1]
                if Project_name == '':
                    Project_id = 0
                    check_result_list.append("所属项目名称不可以为空")
                else:
                    # 根据项目名称获取项目id
                    Project_id = Sys_Project.objects.values('id').filter(project_name__exact=Project_name)
                    if Project_id.count()!=0:
                        Project_id=Project_id[0]['id']
                    else:
                        Project_id = 0
                        check_result_list.append("所属项目名称不存在")

                #根据接口名称以及模块名称获取接口id
                Interface_name=row_data[3]
                if Interface_name == '':
                    Interface_id = 0
                    check_result_list.append("接口名称不可以为空")
                else:
                    Interface_id = Lyzd_Interface.objects.values('id').filter(interface_name_zh__exact=Interface_name,project_id__exact=Project_id)
                    if Interface_id.count()!=0:
                        Interface_id=Interface_id[0]['id']
                    else:
                        Interface_id=0
                        check_result_list.append("所属项目下不存在该接口名称")

            elif i==1:
                #定义存放headerkey、paramkey的list,将模板第一行的headerkey、paramkey存起来
                # headerkeylist=[]
                # paramkeylist=[]
                # Header_key=Lyzd_Interface_Header.objects.values('header_key').filter(interface_id__exact=Interface_id)
                # for a in range(0,len(Header_key)):
                #     headerkeylist.append(Header_key[a]['header_key'])
                #
                # Param_key=Lyzd_Interface_Param.objects.values('param_key').filter(interface_id__exact=Interface_id)
                # for a in range(0,len(Param_key)):
                #     paramkeylist.append(Param_key[a]['param_key'])
                continue
            elif i>1:
                # print(headerkeylist,paramkeylist)
                #判断case_type名称是否为空,是否存在
                Case_type_name = row_data[0]
                if Case_type_name == '':
                    check_result_list.append('第'+str(i+1)+"行用例分类不可以为空")
                else:
                    # 根据用例分类名称获取case_type
                    Case_type = Sys_Dic.objects.values('code_id').filter(code_name__exact=Case_type_name)
                    if Case_type.count()!=0:
                        Case_type=Case_type[0]['code_id']
                    else:
                        # Case_type = ''
                        check_result_list.append('第'+str(i+1)+"行用例分类名称不存在")
                        pass

                # 判断用例名称不可以为空
                case_name = row_data[1]
                if case_name == '':
                    check_result_list.append('第'+str(i+1)+"行用例名称不可以为空")

                #check_type在模板中的位置
                check_type_site = col_num-6
                Check_type_name = row_data[check_type_site]
                # 判断check_type名称是否为空,是否存在
                if Check_type_name == '':
                    check_result_list.append('第'+str(i+1)+'行校验分类名称不可以为空')
                else:
                    #根据check_type名称获取Check_type
                    Check_type = Sys_Dic.objects.values('code_id').filter(code_name__exact=Check_type_name)
                    if Check_type.count() != 0:
                        Check_type = Check_type[0]['code_id']
                    else:
                        # Check_type = ''
                        check_result_list.append('第'+str(i+1)+'行校验分类名称不存在')
                        pass

                #判断校验分类是否为response
                if Check_type == '0':
                    Action_condition_name=row_data[check_type_site+1]
                    # 判断校验分类为response时，action_condition名称是否为空,是否存在
                    if Action_condition_name == '':
                        check_result_list.append('第'+str(i+1)+'行校验分类为response时,执行条件不可以为空')
                    else:
                        #根据Action_condition名称获取Action_condition
                        Action_condition = Sys_Dic.objects.values('code_id').filter(code_name__exact=Action_condition_name)
                        if Action_condition.count() != 0:
                            Action_condition = Action_condition[0]['code_id']
                        else:
                            # Action_condition = ''
                            check_result_list.append('第' + str(i+1) + '行校验分类为response时,执行条件不存在')
                            pass

                    check_key = row_data[check_type_site + 2]
                    #判断校验分类为response时，校验key是否为空
                    if check_key == '':
                        check_result_list.append('第' + str(i+1) + '行校验分类为response时,校验key不可以为空')

                    Check_condition_name=row_data[check_type_site+3]
                    # 判断校验分类为response时，校验条件是否为空，是否存在
                    if Check_condition_name == '':
                        check_result_list.append('第' + str(i+1) + '行校验分类为response时, 校验条件不可以为空')
                    else:
                        #根据Check_condition名称获取Check_condition
                        Check_condition = Sys_Dic.objects.values('code_id').filter(
                            code_name__exact=Check_condition_name)
                        if Check_condition.count() != 0:
                            Check_condition = Check_condition[0]['code_id']
                        else:
                            # Check_condition = ''
                            check_result_list.append('第' + str(i+1) + '行校验分类为response时, 校验条件不存在')
                            pass

                    expect_value = row_data[check_type_site + 5]
                    #判断校验分类为response时，逾期值是否为空
                    if expect_value == '':
                        check_result_list.append('第' + str(i+1) + '行校验分类为response时,预期值不可以为空')
                # 判断校验分类是否为database
                elif Check_type == '1':
                    check_sql = row_data[check_type_site+4]
                    #判断校验分类为database时，执行sql是否为空
                    if check_sql == '':
                        check_result_list.append('第' + str(i+1) + '行校验分类为database时,执行sql不可以为空')

                    #判断校验分类为database时，预期值是否为空
                    expect_value = row_data[check_type_site + 5]
                    if expect_value == '':
                        check_result_list.append('第' + str(i+1) + '行校验分类为database时,预期值不可以为空')

    print(check_result_list)
    return check_result_list

#用例模板excel文件导入
def case_store_to(x):
    # book = xlrd.open_workbook(x)  # 打开excel文件
    book = xlrd.open_workbook(file_contents=x, on_demand=True)
    sheets = book.sheet_names()  # 获取所有sheet表名
    check_result_list = []  # 存放check结果
    print(111)
    for sheet in sheets:
        sh = book.sheet_by_name(sheet)  # 打开每一张表
        row_num = sh.nrows  # 获取excel的行数
        col_num = sh.ncols  # 获取excel的列数

        for i in range(0, row_num):  # 从第一行开始读取表中的数据
            row_data = sh.row_values(i)  # 按行获取excel的值

            if i == 0:
                Project_name = row_data[1]
                if Project_name == '':
                    Project_id = 0
                else:
                    # 根据项目名称获取项目id,当项目名称存在时则将project_name转化为prject_id；项目名称为空或不存在时，prject_id赋值为0
                    print(Project_name)
                    Project_id = Sys_Project.objects.values('id').filter(project_name__exact=Project_name)
                    print(Project_id)
                    if Project_id.count() != 0:
                        Project_id = Project_id[0]['id']
                    else:
                        Project_id = 0

                # 根据接口名称以及模块名称获取接口id，当接口名称存在时则将Interface_name转化为Interface_id_id；接口名称为空或不存在时，Interface_id赋值为0
                Interface_name = row_data[3]
                if Interface_name == '':
                    Interface_id = 0
                else:
                    Interface_id = Lyzd_Interface.objects.values('id').filter(interface_name_zh__exact=Interface_name,
                                                                              project_id__exact=Project_id)
                    if Interface_id.count() != 0:
                        Interface_id = Interface_id[0]['id']
                    else:
                        Interface_id = 0

                #判断当项目名称、接口名称为空或者不存在时跳出循环不执行插入操作
                if Project_id==0 or Interface_id == 0:
                    break
            elif i==1:
                # 定义存放headerkey、paramkey的list,将模板第一行的headerkey、paramkey存起来
                # headerkeylist=[]
                paramkeylist=[]
                # Header_key=Lyzd_Interface_Header.objects.values('header_key').filter(interface_id__exact=Interface_id)
                # for a in range(0,len(Header_key)):
                #     headerkeylist.append(Header_key[a]['header_key'])

                Param_key=Lyzd_Interface_Param.objects.values('param_key').filter(interface_id__exact=Interface_id)
                for a in range(0,len(Param_key)):
                    paramkeylist.append(Param_key[a]['param_key'])
            elif i>1:
                #读取excel表的值并赋值给变量
                # 根据用例分类名称获取case_type，若Case_type_name不存在，则赋值为''；
                Case_type_name = row_data[0]
                Case_type = Sys_Dic.objects.values('code_id').filter(code_name__exact=Case_type_name)
                if Case_type.count() != 0:
                    Case_type = Case_type[0]['code_id']
                else:
                    Case_type = ''

                #根据用例名称获取用例id，若用例id不存在，则赋值为'';
                Case_name = row_data[1]
                Case_id = Lyzd_Interface_Case.objects.values('id').filter(interface_id__exact=Interface_id,case_name__exact=Case_name)
                if Case_id.count() !=0:
                    Case_id = Case_id[0]['id']
                else:
                    Case_id = ''


                # check_type在模板中的位置
                check_type_site = col_num - 6
                # 根据check_type名称获取Check_type，若check_type不存在，则赋值为''；
                Check_type_name = row_data[check_type_site]
                Check_type = Sys_Dic.objects.values('code_id').filter(code_name__exact=Check_type_name)
                if Check_type.count() != 0:
                    Check_type = Check_type[0]['code_id']
                else:
                    Check_type = ''

                # 根据Action_condition名称获取Action_condition，若Action_condition不存在，则赋值为''；
                Action_condition_name = row_data[check_type_site + 1]
                Action_condition = Sys_Dic.objects.values('code_id').filter(
                    code_name__exact=Action_condition_name)
                if Action_condition.count() != 0:
                    Action_condition = Action_condition[0]['code_id']
                else:
                    Action_condition = ''

                # 根据Check_condition名称获取Check_condition
                Check_condition_name = row_data[check_type_site + 3]
                Check_condition = Sys_Dic.objects.values('code_id').filter(
                    code_name__exact=Check_condition_name)
                if Check_condition.count() != 0:
                    Check_condition = Check_condition[0]['code_id']
                else:
                    Check_condition = ''

                project_id=Project_id
                interface_id=Interface_id
                case_type=Case_type
                case_name=row_data[1]
                case_id=Case_id
                check_type=Check_type
                action_condition=Action_condition
                check_key = row_data[check_type_site + 2]
                check_condition=Check_condition
                check_sql = row_data[check_type_site + 4]
                expect_value = row_data[check_type_site + 5]

                create_user='批量导入'
                modify_user='批量导入'

                print('cccc')

                #当本行数据的校验不通过时则不插入本行，开始执行插入下一行数据
                if case_type=='' or case_name=='' or check_type=='':
                    continue
                if check_type==0:
                    if action_condition=='' or check_key=='' or check_condition=='' or expect_value:
                        continue
                elif check_type==1:
                    if check_sql=='' or expect_value=='':
                        continue


                #在Lyzd_Interface_Case表中根据interface_id获取case_name
                Case_name=Lyzd_Interface_Case.objects.values('case_name').filter(interface_id__exact=interface_id,case_name__exact=case_name)
                print(Case_name)
                print(Case_name.count())
                #判断用例名称存在时执行更新操作
                if Case_name.count() != 0:
                    pass
                    #更新Lyzd_Interface_Case表
                    UpdataCase.updateCase(case_name, create_user, modify_user, check_type, case_type,
                   interface_id, action_condition)
                    print('更新case表')
                    #更新Lyzd_Interface_Header_Param表
                    # a = 1
                    # for header_key in headerkeylist:
                    #     a = a + 1
                    #     header_value = row_data[a]
                    #     UpdataCase.updateHeaderParam(interface_id, create_user, header_key, header_value, case_id)
                    # print('更新case——header表')
                    #更新Lyzd_Interface_Case_Param表
                    # b = a
                    # for param_key in paramkeylist:
                    #     b = b + 1
                    #     param_value = row_data[b]
                    #     UpdataCase.UpdateCaseParam(interface_id, modify_user, param_key, param_value, case_id)
                    # print('更新case——param表')
                    # 更新Lyzd_Interface_Case_Param表
                    a = 1
                    for param_key in paramkeylist:
                        a = a + 1
                        param_value = row_data[a]
                        UpdataCase.UpdateCaseParam(interface_id, modify_user, param_key, param_value, case_id)
                    print('更新case——param表')
                    #更新Lyzd_Interface_Case_Check表
                    if check_type == '0':
                        UpdataCase.updateCaseCheck(expect_value,modify_user, check_key, check_condition, case_id)
                        print('更新0check表')
                    #校验分类为database的情况下Lyzd_Interface_Case_Check表数据插入
                    elif check_type == '1':
                        UpdataCase.updateCaseCheckDB(expect_value, check_sql, modify_user, case_id)
                        print('更新1check表')
                #判断用例名称不存在时执行插入操作
                else:
                    #Lyzd_Interface_Case表数据插入
                    Interface.addCase(case_name, create_user, modify_user, check_type, case_type,
                            interface_id, action_condition,project_id)
                    #获取最新的case_id
                    case_id=Lyzd_Interface_Case.objects.values('id').last()['id']
                    print('最新case_id'+str(case_id))
                    #Lyzd_Interface_Header_Param表数据插入
                    # a = 1
                    # for header_key in headerkeylist:
                    #     a=a+1
                    #     header_value=row_data[a]
                    #     Interface.addCaseHeaderParam(interface_id, create_user, modify_user, header_key, header_value,
                    #                         case_id)
                    # #Lyzd_Interface_Case_Param表数据插入
                    # b = a
                    # for param_key in paramkeylist:
                    #     b=b+1
                    #     param_value=row_data[b]
                    #     Interface.addCaseParam(interface_id, create_user, modify_user, param_key, param_value, case_id)
                    #Lyzd_Interface_Case_Param表数据插入
                    a = 1
                    for param_key in paramkeylist:
                        a=a+1
                        param_value=row_data[a]
                        Interface.addCaseParam(interface_id, create_user, modify_user, param_key, param_value, case_id)
                    #Lyzd_Interface_Case_Check表数据插入
                    #校验分类为response的情况下Lyzd_Interface_Case_Check表数据插入
                    if check_type == '0':
                        Interface.addCaseCheck(expect_value, create_user, modify_user, check_key, check_condition, case_id)
                        print('0' + '插入校验')
                    #校验分类为database的情况下Lyzd_Interface_Case_Check表数据插入
                    elif check_type == '1':
                        Interface.addCaseCheckDB(expect_value, check_sql, create_user, modify_user, case_id)
                        print('1'+'插入校验')
                    print(paramkeylist)


class CaseExcleImport(APIView):
    authentication_classes = (TokenAuthentication,)
    permission_classes = ()

    def post(self, request):
        try:
            p_file_list = request.FILES.getlist("file", None)
            aa = p_file_list[0]
            bb = p_file_list[0]
            x = p_file_list[0].read()
            case_store_to(x)
            print('aaaa')
            check_resultlist = case_excel_check(x)  # 解析检查文件内容bing
            # check_resultlist=excel_check("导入模板1(1).xlsx")#解析检查文件内容bing
            print(check_resultlist)
            print(check_resultlist.__len__())

            if check_resultlist.__len__() != 0:  # 校验报错
                return JsonResponse(code="999997", data=check_resultlist, msg="校验失败")

            else:  # 正常
                return JsonResponse(code="999999", msg="导入成功")
        except Exception as e:
            return JsonResponse(code="999998", msg="导入失败")


interface_id = Lyzd_Script.objects.values('id').last()['id']
# interface_id = Lyzd_Script.objects.values('id').get(id__exact=1)
print(interface_id)
# if __name__ == '__main__':
#     case_store_to('C:\\Users\\fengkai\\Desktop\\1611714061.xlsx')
#     case_excel_check('C:\\Users\\fengkai\\Desktop\\1611714061.xlsx')

